package pers.xiaojun.boot.module.system.service.permission;

import com.baomidou.mybatisplus.extension.service.IService;
import pers.xiaojun.boot.module.system.controller.permission.vo.menu.MenuReqVO;
import pers.xiaojun.boot.module.system.controller.permission.vo.menu.MenuRespVO;
import pers.xiaojun.boot.module.system.controller.permission.vo.menu.MenuSaveVO;
import pers.xiaojun.boot.module.system.dao.entity.permission.MenuDO;

import java.util.Collection;
import java.util.List;

/**
 * 菜单服务类
 *
 * @author xiaojun
 * @since 2025-10-10
 */
public interface MenuService extends IService<MenuDO> {

    /**
     * 保存菜单
     *
     * @param menuSave 菜单信息VO
     * @return 保存成功的菜单实体
     */
    MenuDO saveMenu(MenuSaveVO menuSave);

    /**
     * 更新菜单
     *
     * @param menuSave 菜单信息VO
     * @return 更新成功的菜单实体
     */
    MenuDO updateMenu(MenuSaveVO menuSave);

    /**
     * 根据菜单Id删除菜单
     *
     * @param id 菜单Id
     */
    void removeMenuById(Long id);

    /**
     * 根据菜单Id删除一批菜单
     *
     * @param ids 菜单Id列表
     */
    void removeMenuByIds(List<Long> ids);


    /**
     * 根据菜单Id获取菜单
     *
     * @param menuId 菜单Id
     * @return 菜单VO
     */
    MenuRespVO getMenuById(Long menuId);

    /**
     * 获取权限标识的菜单Id列表
     *
     * @param permission 权限标识
     * @return 菜单Id列表
     */
    List<Long> listMenuIdsByPermission(String permission);

    /**
     * 获取菜单列表（可条件查询）
     *
     * @param menuReqVO 查询数据
     * @return 菜单列表
     */
    List<MenuDO> listMenus(MenuReqVO menuReqVO);

    /**
     * 获取租户下的菜单信息
     *
     * @return 菜单列表
     */
    List<MenuDO> listMenusByTenant();

    /**
     * 校验多个菜单是否存在
     *
     * @param menuIds 菜单Id列表
     */
    void validateMenusExists(Collection<Long> menuIds);

}
